package controller;

import eccezioni.AnnuncioChiusoException;
import eccezioni.CampoErratoException;
import eccezioni.UtenteNonCreatoreException;
import entity.Adesione;
import entity.Annuncio;
import entity.Articolo;
import entity.UtenteRegistrato;
import javax.ejb.Local;

/**
 * Metodi per il creatore dell'annuncio
 * @author Ale
 */
@Local
public interface ControllerCreazioneAnnuncioLocal {

    /**
     * Metodo per inserire un annuncio
     * @param sito url del sito a cui l'annuncio si riferisce
     * @param chiusuraStr data di chiusura, nel formato dd-MM-yyyy
     * @param ordineStr data di ordine, nel formato dd-MM-yyyy
     * @param spedizioneStr spese di spedizione
     * @param indirizzo indirizzo a cui gli iscritti all'annuncio potranno ritirare i propri articoli
     * @param gratuitaStr "on" sse il sito prevede la spedizione gratuita a fronte di una certa spesa minima
     * @param minimaGratuitaStr spesa minima per ottenere la spedizione gratuita, può essere null se gratuitaStr non è "on"
     * @param spesaInizialeStr spesa iniziale del creatore dell'annuncio, può essere null se gratuitaStr non è "on"
     * @param creatore utente che crea l'annuncio
     * @throws CampoErratoException se uno o più campi sono errati
     */
    public void inserisciAnnuncio(String sito, String chiusuraStr, String ordineStr, String spedizioneStr, String indirizzo, String gratuitaStr, String minimaGratuitaStr, String spesaInizialeStr, UtenteRegistrato creatore) throws CampoErratoException;

    /**
     * Metodo che permette al creatore di un annuncio di accettare un'adesione al proprio annuncio
     * @param a adesione da accettare
     * @param utenteLoggato creatore dell'annuncio
     * @throws UtenteNonCreatoreException se l'utente che vuole effettuare l'operazione non è il creatore dell'annuncio
     */
    public void accettaAdesione(Adesione a, UtenteRegistrato utenteLoggato) throws UtenteNonCreatoreException;

    /**
     * Metodo che permette al creatore di un annuncio di rifiutare un'adesione al proprio annuncio
     * @param a adesione da rifiutare
     * @param utenteLoggato creatore dell'annuncio
     * @throws UtenteNonCreatoreException se l'utente che vuole effettuare l'operazione non è il creatore dell'annuncio
     */
    public void rifiutaAdesione(Adesione a, UtenteRegistrato utenteLoggato) throws UtenteNonCreatoreException;

    /**
     * Metodo che permette al creatore di un annuncio di accettare un articolo di un'adesione a un suo annuncio
     * @param a adesione al suo annuncio
     * @param art articolo da accettare
     * @param utenteLoggato creatore dell'annuncio
     * @throws UtenteNonCreatoreException se l'utente che vuole svolgere l'operazione non è il creatore dell'annuncio
     */
    public void accettaArticolo(Adesione a, Articolo art, UtenteRegistrato utenteLoggato) throws UtenteNonCreatoreException;

    /**
     * Metodo che permette al creatore di un annuncio di rifiutare un articolo di un'adesione a un suo annuncio
     * @param a adesione al suo annuncio
     * @param art articolo da rifiutare
     * @param utente creatore dell'annuncio
     * @throws UtenteNonCreatoreException se l'utente che vuole svolgere l'operazione non è il creatore dell'annuncio
     */
    public void rifiutaArticolo(Adesione a, Articolo art, UtenteRegistrato utente) throws UtenteNonCreatoreException;

    /**
     * Metodo per permettere al creatore di un annuncio di chiudere il suo annuncio, a patto che non sia già chiuso
     * @param a annuncio da chiudere
     * @param utente creatore dell'annuncio
     * @throws UtenteNonCreatoreException se l'utente che vuole svolgere l'operazione non è il creatore dell'annuncio
     * @throws AnnuncioChiusoException se l'annuncio è già chiuso
     */
    public void chiudiAnnuncio(entity.Annuncio a, entity.UtenteRegistrato utente) throws UtenteNonCreatoreException, AnnuncioChiusoException;

    /**
     * Metodo per permettere al creatore di un annuncio di rimuovere il suo annuncio, a patto che non sia già chiuso
     * @param a annuncio da rimuovere
     * @param utente creatore dell'annuncio
     * @throws UtenteNonCreatoreException se l'utente che vuole svolgere l'operazione non è il creatore dell'annuncio
     * @throws AnnuncioChiusoException se l'annuncio è già chiuso
     */
    public void rimuoviAnnuncio(entity.Annuncio a, entity.UtenteRegistrato utente) throws eccezioni.UtenteNonCreatoreException, eccezioni.AnnuncioChiusoException;

    /**
     * Metodo per permettere al creatore dell'annuncio di modificare la propria spesa per quell'ordine
     * @param utenteLoggato creatore dell'annuncio
     * @param annuncio annuncio di cui modificare la spesa
     * @param spesa nuovo valore per la spesa del creatore
     * @throws UtenteNonCreatoreException se l'utenteLoggato non è il creatore dell'annuncio
     * @throws CampoErratoException se la nuova spesa non ha un formato riconoscibile come valuta
     */
    public void modificaSpesaCreatore(UtenteRegistrato utenteLoggato, Annuncio annuncio, String spesa) throws UtenteNonCreatoreException, CampoErratoException, AnnuncioChiusoException;

}
